package com.study.compose.coroutines

import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

/**
 * 取消协程
 * 在一个长时间运行的程序中，你也许需要对后台协程进行细粒度的控制，例如：
 * 用户关闭了一个启动协程的页面，这时，协程已不再被需要了，它应该被取消掉
 *
 */
fun main() = runBlocking<Unit> {

    /**
     * 开启一个协程，每个一秒打印一行文字
     */
    val job = launch {
        try {
            repeat(1000) {
                delay(1000)
                println("如果你不取消，我将执行1000次")
            }
        } finally {
            //当挂起函数被取消的时候，会执行finally代码块，用于释放资源
            println("已结束，请释放资源")
        }
    }


    //延迟10秒后,终止子协程的执行
    delay(10000)
    //取消掉协程执行，因为我们在runBlocking中执行协程，其会等待子协程执行结束，否则的话需要调用
    //job.join()
    job.cancel()
    println("程序结束啦")

    //还有一个合并了job.cancel()和job.join()的方法
    //job.cancelAndJoin()
}